import type { AppointmentManagement } from '@shared/types/'

/**
 * 预约选项：
 * - headless：Playwright 无头模式开关（仅对 Playwright 策略有效）。
 * - timeoutMs：单步超时（毫秒）。
 * - preferredDates/Times：首选日期/时段（格式与页面显示一致）。
 * - officeCode：可扩展的办事处代码（预留）。
 */
export interface BookingOptions {
  headless?: boolean
  timeoutMs?: number
  preferredDates?: string[]
  preferredTimes?: string[]
  officeCode?: string
  /**
   * 预约日期范围（会话级）。
   * 格式允许 YYYY-MM-DD 或 DD-MM-YYYY；缺省端为单边限制。
   */
  allowedDateRange?: { start?: string, end?: string }
  /**
   * 进度回调（可选）：由调用方提供，用于上报细粒度进度与步骤。
   */
  onProgress?: (p: { progress: number, step: string, timestamp: number }) => void
  /**
   * 任务优先级（多进程模式使用）：
   * - 1 (HIGH): 监控触发的预约
   * - 2 (NORMAL): 用户手动预约（默认）
   * - 3 (LOW): 批量预约
   */
  priority?: number
  /**
   * Job ID（可选）：用于关联UI日志记录
   */
  jobId?: string
}

/**
 * 预约结果：
 * - success：整体成功与否。
 * - referenceNumber：成功时的参考编号。
 * - selectedDate / selectedTimeslot：成功或已选择的日期/时段，便于前端展示。
 * - error：失败原因。
 */
export interface BookingOutcome {
  success: boolean
  referenceNumber?: string
  selectedDate?: string
  selectedTimeslot?: string
  error?: string
  /**
   * 流量统计（可选）：
   * - totalUp/totalDown：总上/下行字节数
   * - perStep：按步骤聚合（仅 Playwright 模式提供）
   */
  traffic?: {
    totalUp: number
    totalDown: number
    perStep?: Record<string, { up: number, down: number, count: number }>
  }
}

/**
 * 策略接口：
 * - 提供统一的 book 方法，隐藏具体实现（Playwright / Request）。
 */
export interface BookingStrategy {
  book: (appointment: AppointmentManagement, options?: BookingOptions) => Promise<BookingOutcome>
}
